/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package src.j2ee.compumake.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import src.j2ee.compumake.dominio.Arquitectura;
import src.j2ee.compumake.dominio.Marca;
import src.j2ee.compumake.dominio.Socket;
import src.j2ee.compumake.dominio.TarjetaMadre;
import src.j2ee.compumake.dominio.TipoMemoria;
import src.j2ee.compumake.dominio.TipoVideo;
import src.j2ee.compumake.dominio.VelocidadMemoria;

/************************************************************************
 **                                                                    **
 ** Nombre: DAOTarjetaMadre.java                                       **
 ** Version: v1.0.0                                                    **
 ** Autor: amado.cante                                                 **
 ** Creado: 25/04/2013                                                 **
 ** Modificado:                                                        **
 ** Diagrama:                                                          **
 ** Caso de uso:                                                       **
 **                                                                    **
 ***********************************************************************/
public class DAOTarjetaMadre {
    private static final String TABLA_TARJETA_MADRE = "TarjetasMadre";
    private static final String ID_TARJETA = "idTarjetaMadre";
    private static final String MARCA = "marca";
    private static final String NOMBRE = "nombre";
    private static final String IDE = "IDE";
    private static final String SATA = "SATA";
    private static final String PS2 = "PS2";
    private static final String USB = "USB";
    private static final String VIDEO_INTEGRADO = "videoIntegrado";
    private static final String AGP = "slotAGP";
    private static final String PCI = "slotPCI";
    private static final String SLOTS_MEMORIA = "slotMemoria";
    private DAOProducto daoProducto;
    private DAOMarca daoMarca;
    private DAOArquitecturasTarjetaMadre daoArquitecturas;
    private DAOTipoMemoriaTarjetaMadre daoTipoMemoria;
    private DAOVelocidadesMemoriaTarjetaMadre daoVelocidadesMemoria;
    private DAOSocketsTarjetaMadre daoSockets;
    private DAOTipoVideo daoTipoVideo;
    private Connection conexion;
    private AccesoBaseDatos acceso = new AccesoBaseDatos();
    
    public DAOTarjetaMadre(){
        this.conexion = this.acceso.abrirConexion();
        this.daoMarca = new DAOMarca();
        this.daoProducto = new DAOProducto();
        this.daoSockets = new DAOSocketsTarjetaMadre();
        this.daoTipoMemoria = new DAOTipoMemoriaTarjetaMadre();
        this.daoVelocidadesMemoria = new DAOVelocidadesMemoriaTarjetaMadre();
        this.daoArquitecturas = new DAOArquitecturasTarjetaMadre();
        this.daoTipoVideo = new DAOTipoVideo();
    }
    
    public TarjetaMadre registrarTarjetaMadre(TarjetaMadre tarjeta){
        TarjetaMadre tm;
        try{
            String query = "INSERT INTO "+TABLA_TARJETA_MADRE+"("+MARCA
                    +","+NOMBRE+","+IDE+","+SATA+","+PS2+","+USB+","+VIDEO_INTEGRADO
                    +","+AGP+","+PCI+","+SLOTS_MEMORIA+") VALUES('"
                    + tarjeta.getMarca().getClave()+"','"
                    + tarjeta.getNombre()+"','"+ tarjeta.getIdes()+"','"
                    + tarjeta.getSatas()+"','"+tarjeta.getPs2()+"','"
                    + tarjeta.getUsbs()+"','"+tarjeta.getVideoIntegrado().getIdTipo()
                    +"','"+tarjeta.getSlotsAGP()+"','"+tarjeta.getSlotsPCI()+"','"
                    +tarjeta.getNumSlotsMemoria()+"')";
            PreparedStatement sentencia = conexion.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
            int afectados = sentencia.executeUpdate();
            if(afectados==0){
                return null;
            }else{
                ResultSet generado = sentencia.getGeneratedKeys();
                if(generado.next()){
                    int id = generado.getInt(1);
                    tm = tarjeta;
                    tm.setClave(id);
                    ArrayList<Arquitectura> arquitecturas = daoArquitecturas.registrarArquitecturasTarjetaMadre(tm.getArquitecturas(),tm.getClave());
                    ArrayList<TipoMemoria> tiposMemoria = daoTipoMemoria.registrarTipoMemoria(tm.getTiposMemoria(), tm.getClave());
                    ArrayList<VelocidadMemoria> velocidadesMemoria = daoVelocidadesMemoria.registrarVelocidadMemoria(tm.getVelocidadesMemoria(), tm.getClave());
                    ArrayList<Socket> sockets = daoSockets.registrarSocketsTarjetaMadre(tm.getSockets(), tm.getClave());
                    if(arquitecturas != null && tiposMemoria!=null && velocidadesMemoria != null && sockets!=null){
                        return tm;
                    }else{
                        return null;
                    }
                }else{
                    return null;
                }
            }
        }catch(SQLException ex){
            return null;
        }
    }

    public TarjetaMadre buscarTarjetaMadre(int idTarjetaMadre){
        try{
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String query = "SELECT * FROM "+TABLA_TARJETA_MADRE+" WHERE "+ID_TARJETA+"='"+idTarjetaMadre+"';";
            ResultSet resultado = sentencia.executeQuery(query);
            if(resultado.first()){
                int idMarca = resultado.getInt(2);
                String nombre = resultado.getString(3);
                int ides = resultado.getInt(4);
                int satas = resultado.getInt(5);
                int ps2 = resultado.getInt(6);
                int usbs = resultado.getInt(7);
                int claveVideo = resultado.getInt(8);
                int agps = resultado.getInt(9);
                int pcis = resultado.getInt(10);
                int slotsMemoria = resultado.getInt(11);
                Marca marca = daoMarca.buscaMarca(idMarca);
                TipoVideo tipoVideo = daoTipoVideo.buscaTipoVideo(claveVideo);
                ArrayList<TipoMemoria> tiposMemoria = daoTipoMemoria.obtenerTiposMemoriaTarjetaMadre(idTarjetaMadre);
                ArrayList<VelocidadMemoria> velocidadesMemoria = daoVelocidadesMemoria.obtenerVelocidadesMemoriaTarjetaMadre(idTarjetaMadre);
                ArrayList sockets = daoSockets.obtenerSocketsTarjetaMadre(idTarjetaMadre);
                ArrayList<Arquitectura> arquitecturas = daoArquitecturas.obtenerArquitecturasTarjetaMadre(idTarjetaMadre);
                int existencias = daoProducto.obtenerExistenciaProducto(idTarjetaMadre, (daoProducto.getTipos().get(TarjetaMadre.class)).intValue());
                double precio = daoProducto.obtenerPrecioProducto(idTarjetaMadre, (daoProducto.getTipos().get(TarjetaMadre.class)).intValue());
                String ruta = daoProducto.obtenerRutaImagen(idTarjetaMadre,(daoProducto.getTipos().get(TarjetaMadre.class)).intValue());
                TarjetaMadre tarjeta = new TarjetaMadre(sockets, ides, satas, ps2, usbs, tipoVideo, agps, pcis, slotsMemoria, arquitecturas, tiposMemoria, velocidadesMemoria, idTarjetaMadre, nombre, marca, existencias, ruta, precio);
                return tarjeta;
            }else{
                return null;
            }
        }catch(SQLException ex){
            return null;
        }
    }
    
    public ArrayList<TarjetaMadre> listarTarjetasMadre(){
        ArrayList<TarjetaMadre> tarjetas = new ArrayList<>();
        try{
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String query = "SELECT "+ID_TARJETA+" FROM "+TABLA_TARJETA_MADRE;
            ResultSet resultado = sentencia.executeQuery(query);
            while(resultado.next()){
                int idTarjetaMadre = resultado.getInt(1);
                TarjetaMadre tm = this.buscarTarjetaMadre(idTarjetaMadre);
                if(tm!=null){
                    tarjetas.add(tm);
                }
            }
            return tarjetas;
        }catch(SQLException ex){
            return tarjetas;
        }
    }
}
